package QianFeng08.CollectionsDemo;

import java.util.*;

/**
 * Collections工具类
 *
 * Collection与Collections的根本区别是：
 * 1、Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。
 *    Collection接口在Java类库中有很多具体的实现。Collection接口意义是为各种具体的集合提供了最大化的统一操作方式。
 * 2、Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。
 *    此类不能实例化，就像一个工具类，服务于Java的Collection框架。
 *
 * 1.排序操作(主要针对List接口相关)
 * reverse(List list):             反转指定List集合中元素的顺序
 * shuffle(List list):             对List中的元素进行随机排序(洗牌)
 * sort(List list):                对List里的元素根据 自然升序排序
 * sort(List list, Comparator c):  自定义比较器进行排序
 * swap(ist list, int i, int j):    将指定List集合中i处元素和j处元素进行交换
 * rotate(List list, int distance): 将所有元素向右移位指定长度，如果distance等于size那么结果不变
 *
 * 2.查找和替换(主要针对Collection接口相关)
 * binarySearch(List list, Object key);使用二分搜索法，以获得指定对象在List中的索引，前提是集合已经排序
 * max(Collection cl):                   返回最大元素
 * max(Collection coll, Comparator comp):根据自定义比较器，返回最大元素
 * min(Collection ol):                    返回最小元素
 * min(Collection cll, Comparator comp):根据自定义比较器，返回最小元素
 * fill(list list, Object obj):          使用指定对象填充
 * frequency(Collection Object o);         返回指定集合中指定对象出现的次数
 * replaceAll(List list, Object old, Object new):替换
 *
 * 3.同步控制
 * Collections.工具类中提供了多个synchronizedXxx方法，该方法返回指定集合对象对应的同步对象，从而解诀多线程
 * 并发访问集合时线程的安全问题。HashSet、 ArrayList、 HashMap都是线程不安全的，如果需要考虑同步，
 * 则使用这些方法。这些方法主要有: synchronizedSet、 synchronizedSortedSet、 synchronizedList、
 * synchronizedMap、synchronizedSortedMap 。
 * 特别需要指出的是，在使用迭代方法遍历集合时需要手工同步返回的集合。
 *
 * 4.设置不可变集合
 * Collections有三类方法可返回一个不可变集合:
 * emptyXxx()            返回一个空的不可变的集合对象
 * singletonXxx()        返回一个只包含指定对象的，不可变的集合对象。
 * unmodifiableXxx()    返回指定集合对象的不可变视图
 *
 * 5.其它
 * disjoint(Collection<?> c1, Collection<?> c2) -如果两个指定collection中没有相同的元素，则返回true。
 * adAlCollection<? superT>c, T.. a) 一种方便的方式，将所有指定元素添到指定collection中。
 * Comparator<T> reverseOrder(Comparator<T> cmp) -返回一个比较器，它强行反转指定比较器的顺序。如果指定比较
 * 器为null,则此方法等同于reverseOrder() (换句话说，它返回一个比较器，该比较器将强行反转实现
 * Comparable接口那些对象 collection 上的自然顺序)。 .
 **/
public class CollectionsDemo {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("大神");
        list.add("大佬");
        list.add("高手");

        /*List接口相关的操作：排序*/
        //Collections.reverse(list);//反转顺序(倒序)
        //Collections.reverse(list);//元素随机排序
        Collections.sort(list);//默认排序（字母或数字）
        //Collections.sort(list, String::compareTo);//自定义排序重写compareTO方法
        //Collections.swap(list, 0, 1);//位置交换
        //Collections.rotate(list, 1);//向右挪指定长度，后面的元素到前面，前面的元素到后面。size不变
        System.out.println(list);

        /*Collection接口相关的操作：查找和替换*/
        System.out.println(Collections.binarySearch(list, "大神"));//返回大神的索引（排好序为前提）
        System.out.println(Collections.max(list));//输出最大元素
        System.out.println(Collections.min(list));//输出最小元素
        //Collections.fill(list, "菜鸟");//将所有元素填充为 菜鸟
        System.out.println(Collections.frequency(list, "大神"));//返回 大神 出现的次数
        //Collections.replaceAll(list, "高手", "菜鸟");//将高手替换为菜鸟
        System.out.println(list);

        /*同步控制*/
        List<String> syncList = Collections.synchronizedList(new ArrayList<>());//保证ArrayList线程安全

        /*设置不可变集合*/
        //List<String> emptyList = Collections.emptyList();//返回一个空List集合
        Dog dog = new Dog("张三");
        List<Dog>  singList = Collections.singletonList(dog);//返回一个不可变集合
        List<String> unm = Collections.unmodifiableList(list);
        System.out.println(unm);//返回指定集合对象的不可变视图

        /*其他*/
        Collections.sort(list, Collections.reverseOrder());//倒序输出


    }
}

class Dog {
    private String name;

    public Dog(String name) {
        this.name = name;
    }

    public Dog() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
